package top.mybatisx.sql.core.sql;

import top.mybatisx.sql.core.sql.base.BaseSql;
import top.mybatisx.sql.core.sql.brige.DistinctFrom;
import top.mybatisx.sql.core.table.QueryColumn;
import top.mybatisx.sql.core.toolkit.Assert;

import java.util.Arrays;

/**
 * 查询
 */
public interface Select<T extends DistinctFrom> extends Distinct, BaseSql {

    // 查询部分的sql
    StringBuilder selectSql = new StringBuilder();

    default T select(QueryColumn... selectColumns) {
        // 加入到查询队列
        selectList.addAll(Arrays.asList(selectColumns));
        return (T) this;
    }

    default T select(String sql) {
        // 加入到查询队列
        selectSql.append(sql);
        return (T) this;
    }

    default String buildSelectSql() {
        if (selectSql.length() > 0) {
            // 如果手工设置了 sql, 直接返回
            return selectSql.toString();
        }
        Assert.notEmpty(selectList, ".select() 不能为空.请设置查询字段");

        // 组装 sql
        selectSql.setLength(0);
        selectSql.append("select ");
        selectSql.append(distinct);

        // 组装所有 列
        for (QueryColumn queryColumn : selectList) {
            String tableAlias = tableAliasMap.get(queryColumn.getTable().getTableName());
            String columnSql = queryColumn.buildSql(tableAlias);
            selectSql.append(columnSql);
        }
        // 去掉 列 最后的逗号
        selectSql.deleteCharAt(selectSql.length() - 1);
        selectSql.append(' ');

        return selectSql.toString();
    }
}
